package com.tangruojie.config;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

/**
 * MyBatis 默认行为是每次执行 SQL 时开启一个新的 JDBC Connection（从连接池拿），然后执行、提交、关闭连接，事务由 JDBC Connection 控制。
 * 问题	                                说明
 * 没有 @Transactional，事务从哪来的？	    MyBatis 每次调用都会从连接池获取一个新的 JDBC Connection，JDBC 自带事务机制
 * 谁开启的事务 T1、T2？	                JDBC Connection 默认是自动提交，每条 SQL 都有自己的“事务”
 * 为什么说它是事务？	                    因为数据库对 update/delete 等写操作默认会用事务控制，即使自动提交，也仍是一个事务单位
 */
public class MybatisConfig {

    /**
     * SqlSession
     *
     * @param dataSource
     * @return
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        ssfb.setTypeAliasesPackage("com.tangruojie.domain");
        ssfb.setDataSource(dataSource);
        return ssfb;
    }

    /**
     * Mapper
     *
     * @return
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.tangruojie.dao");
        return msc;
    }

}



